import os
import requests
from urllib.parse import urlparse


def download_image(image_url, save_dir="downloads"):
    """
    下载图片到本地

    :param image_url: 图片的 URL 地址（如 https://xxx.com/xxx.png）
    :param save_dir: 保存图片的本地目录（默认在当前目录下的 downloads 文件夹）
    :return: 保存的文件路径（成功）或 None（失败）
    """
    try:
        # 1. 创建保存目录（若不存在）
        os.makedirs(save_dir, exist_ok=True)

        # 2. 从 URL 中提取文件名（如 251107113203_0.png）
        parsed_url = urlparse(image_url)
        file_name = os.path.basename(parsed_url.path)
        if not file_name:  # 防止 URL 以 / 结尾导致文件名为空
            file_name = "downloaded_image.png"

        # 3. 拼接保存路径
        save_path = os.path.join(save_dir, file_name)

        # 4. 发送请求下载图片（添加超时和 User-Agent 避免被拦截）
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        }
        response = requests.get(image_url, headers=headers, timeout=10, stream=True)
        response.raise_for_status()  # 若请求失败（如 404），抛出异常

        # 5. 写入文件（二进制模式）
        with open(save_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:  # 过滤空块
                    f.write(chunk)

        print(f"图片下载成功：{save_path}")
        return save_path

    except requests.exceptions.RequestException as e:
        print(f"下载失败（网络错误）：{str(e)}")
    except IOError as e:
        print(f"保存失败（文件错误）：{str(e)}")
    except Exception as e:
        print(f"发生未知错误：{str(e)}")

    return None


# 测试示例（使用你的图片 URL）
if __name__ == "__main__":
    image_url = "https://crashcheck-1256118830.cos.ap-shanghai.myqcloud.com/template_images/251107113203_0.png"
    download_image(image_url)  # 默认保存到当前目录的 downloads 文件夹
    # 可选：指定保存目录
    # download_image(image_url, save_dir="E:/project/images")